<?php
/**
 * Created by PhpStorm.
 * User: RUNFA
 * Date: 2015/9/5
 * Time: 15:44
 */

namespace Admin\Model;

use Think\Upload;

use Think\Model;

class AttachmentModel extends Model
{
	/**
	 * 自动完成
	 * @var array
	 */
	protected $_auto = array(
		array('status', 1, self::MODEL_INSERT),
		array('create_time', NOW_TIME, self::MODEL_INSERT),
	);

	/**
	 * 文件上传
	 * @param  array  $files   要上传的文件列表（通常是$_FILES数组）
	 * @param  array  $setting 文件上传配置
	 * @param  string $driver  上传驱动名称
	 * @param  array  $config  上传驱动配置
	 * @return array           文件上传成功后的信息
	 */
	public function upload($files, $setting, $driver = 'Local', $config = null,$groupid){
		//图片模块配置
		$module_config=array(
			'goods'=>array(
					'maxWidth'=>1024,
					'isNeedOrg'=>1,
					'isNeedWatch'=>1,
			),
			'system_message'=>array(
					'maxWidth'=>400,
					'isNeedOrg'=>''
			),
			'presell_manage'=>array(
					'maxWidth'=>400,
					'isNeedOrg'=>''
			),
			'article'=>array(
					'maxWidth'=>400,
					'isNeedOrg'=>''
			),
			'no_group'=>array(
					'maxWidth'=>400,
					'isNeedOrg'=>1
			),
			'category'=>array(
					'maxWidth'=>400,
					'isNeedOrg'=>1
			),
			'brand'=>array(
					'maxWidth'=>400,
					'isNeedOrg'=>1
			),
			'pc_advertisement'=>array(
					'maxWidth'=>1920,
					'isNeedOrg'=>1
			),
			'mobile_advertisement'=>array(
					'maxWidth'=>1920,
					'isNeedOrg'=>1
			)
		);
		
		/* 上传文件 */
		$setting['callback'] = array($this, 'isFile');
		$setting['removeTrash'] = array($this, 'removeTrash');

        //设置路径
        $_real_root_path = './'.$setting['rootPath'];//这是的图片根目录
        $_org_root_path = './'.$setting['orginPath'];//这是原图根目录
        //设置新的图片目录
        $setting['rootPath'] = $_org_root_path.'/'.date('Y').'/'.date('m').'/';
        $_org_root_path.='/'.date('Y').'/';
        
        //不存在文件夹,则创建文件夹
        if(!is_dir($_real_root_path)){
            mkdir($_real_root_path);//创建根目录rootPath文件夹
        }
        $_real_root_path.='/'.date('Y').'/';
	 	if(!is_dir($_real_root_path)){
            mkdir($_real_root_path);//创建根目录rootPath文件夹
        }
        $_real_root_path.='/'.date('m').'/';
        if(!is_dir($_real_root_path)){
        	mkdir($_real_root_path);//创建根目录rootPath文件夹
        }
        
        
        if(!is_dir($_org_root_path)){
        	mkdir($_org_root_path);//创建根目录rootPath文件夹
        }
        $_org_root_path.='/'.date('m').'/';
        if(!is_dir($_org_root_path)){
        	mkdir($_org_root_path);//创建根目录rootPath文件夹
        }
        
        //原始模块名称
        $org_module_name = $setting['org_module_name'];
        //是否需要原始图片
        $isNeedOrg = $module_config[$org_module_name]['isNeedOrg'];
        $maxWidth = $module_config[$org_module_name]['maxWidth'];
        
        //开始上传图片
		$Upload = new Upload($setting, $driver, $config);
		$info   = $Upload->upload($files);

		
		if($info){ //文件上传成功，记录文件信息
			foreach ($info as $key => &$value){
				/* 已经存在文件记录 */
				if(isset($value['id']) && is_numeric($value['id'])){
					continue;
				}

				/* 记录文件信息  orginPath rootPath savepath*/
				$_oring_path = $_org_root_path.$value['savename'];	//在模板里的url路径,原始图片位置
                $value['path'] = $_real_root_path.$value['savepath'].$value['savename'];//缩略图位置

				$org_name=$value['name'];
				$last_pot=strrpos($org_name,'.');//查找最后一个点的位置，以获取名称
				$_attachment_name=substr($org_name,0,$last_pot);
				$value['attachment_name']=$_attachment_name.'.'.$value['ext'];

				$savename=$value['savename'];
				$last_pot=strrpos($savename,'.');//查找最后一个点的位置，以获取名称
				$_file_name=substr($savename,0,$last_pot);
				$value['file_name']=date('Y').'/'.date('m').'/'.$savename;

				$value['module'] = $setting['module'];//存储模块名称
				$value['file_size'] = $value['size'];
				$value['file_extension_name'] = $value['ext'];
				$value['create_uid'] = UID;
                $value['attachment_groupid'] = $groupid;
				//如果是图片就压缩图片，并把压缩后的图片大小记录到数据库
				$pic_array=array('jpg','jpeg','png','gif','bmp');

				if($this->create($value) && ($id = $this->add())){
					$info['file_name']=$value['file_name'];
					$value['id'] = $id;
                    if(in_array(strtolower($value['ext']),$pic_array)){
                    	//图片大小信息
                    	$imgSize =  getimagesize($_oring_path);
                        //生成缩略图
                        $image = new \Think\Image();
                        $image->open($_oring_path);
                        
                        //如果有需要原图就生成缩略图，否则不生成                
                        if(!empty($isNeedOrg)){
                        	// 按照原图的比例生成一个最大为$ATTACHMENT_UPLOAD['thumb_width']*$ATTACHMENT_UPLOAD['thumb_height']
                        	// 的缩略图名称一样
                        	$image->thumb($setting['thumb_width'], $setting['thumb_height'])->save($value['path']);
                        }
                        
                        
                        //如果原图片宽度大于$maxWidth就将原图压缩为$maxWidthx$maxWidth的缩略图并替换保存
                        if( $imgSize[0]>$maxWidth && !empty($maxWidth) ){
                        	// 按照原图的比例生成一个最大为$maxWidth*$maxWidth的缩略图并保存为缩略图
                        	$image->thumb($maxWidth, $maxWidth)->save($_oring_path);
                        }
                        
                    }
				} else {
					//TODO: 文件上传成功，但是记录文件信息失败，需记录日志
					unset($info[$key]);
				}
			}
			return $info; //文件上传成功
		} else {
			$this->error = $Upload->getError();
			return false;
		}
	}

	/**
	 * 下载指定文件
	 * @param  number  $root 文件存储根目录
	 * @param  integer $id   文件ID
	 * @param  string   $args     回调函数参数
	 * @return boolean       false-下载失败，否则输出下载文件
	 */
	public function download($root, $id, $callback = null, $args = null){
		/* 获取下载文件信息 */
		$file = $this->find($id);
		if(!$file){
			$this->error = '不存在该文件！';
			return false;
		}

		/* 下载文件 */
		switch ($file['location']) {
			case 0: //下载本地文件
				$file['rootpath'] = $root;
				return $this->downLocalFile($file, $callback, $args);
			case 1: //TODO: 下载远程FTP文件
				break;
			default:
				$this->error = '不支持的文件存储类型！';
				return false;

		}

	}

	/**
	 * 检测当前上传的文件是否已经存在
	 * @param  array   $file 文件上传数组
	 * @return boolean       文件信息， false - 不存在该文件
	 */
	public function isFile($file){
		if(empty($file['md5'])){
			throw new \Exception('缺少参数:md5');
		}
		/* 查找文件 */
		$map = array('md5' => $file['md5'],'sha1'=>$file['sha1'],);
		return false;
		//return $this->field(true)->where($map)->find();
	}

	/**
	 * 下载本地文件
	 * @param  array    $file     文件信息数组
	 * @param  callable $callback 下载回调函数，一般用于增加下载次数
	 * @param  string   $args     回调函数参数
	 * @return boolean            下载失败返回false
	 */
	private function downLocalFile($file, $callback = null, $args = null){
		if(is_file($file['rootpath'].$file['savepath'].$file['savename'])){
			/* 调用回调函数新增下载数 */
			is_callable($callback) && call_user_func($callback, $args);

			/* 执行下载 */ //TODO: 大文件断点续传
			header("Content-Description: File Transfer");
			header('Content-type: ' . $file['type']);
			header('Content-Length:' . $file['size']);
			if (preg_match('/MSIE/', $_SERVER['HTTP_USER_AGENT'])) { //for IE
				header('Content-Disposition: attachment; filename="' . rawurlencode($file['name']) . '"');
			} else {
				header('Content-Disposition: attachment; filename="' . $file['name'] . '"');
			}
			readfile($file['rootpath'].$file['savepath'].$file['savename']);
			exit;
		} else {
			$this->error = '文件已被删除！';
			return false;
		}
	}

	/**
	 * 清除数据库存在但本地不存在的数据
	 * @param $data
	 */
	public function removeTrash($data){
		$this->where(array('id'=>$data['id'],))->delete();
	}
}